from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QSizePolicy, QPushButton, QVBoxLayout, QHBoxLayout, QWidget, QLabel, QLineEdit
import sys

'''
    此处的延展，指的是缩放窗口后，组建的延展比例。
        如以 label_box_02.addWidget(btn_1, 2) 为例，此处添加的组件 btn_1 在缩放时候的延展倍率为正常组件的两倍，
        故此组件缩放之后明显比其他组件的尺寸要大一倍

    默认的缩放延展策略为：水平方向延展，垂直方向不延展
        即：self.line_edit_01.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
    
'''

class CustomWidget(QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle('QLabel and  QLineEdit')

        # 设置 QLabel & QLineEdit
        label_01 = QLabel('账号：')
        self.line_edit_01 = QLineEdit()

        # 两个参数分别表示水平方向和垂直方向的延展策略
        self.line_edit_01.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)   # 默认的延展策略，水平延展，垂直不延展
        label_01.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)   

        # 文本框可绑定事件
        self.line_edit_01.textChanged.connect(self.textChanged)     # 文本内容变更，无参
        self.line_edit_01.cursorPositionChanged.connect(self.cursorPositionChanged)   # 光标位置变动，有两个可选参数，oldPos & newPos（还有其他的光标位置变化事件）
        self.line_edit_01.editingFinished.connect(self.editingFinished)     # 编辑完成事件，在"该单元格"按下Enter键，或者失去光标（且输入内容有变）触发
        self.line_edit_01.returnPressed.connect(self.returnPressed)         # "只有"在"该单元格"按下Enter键触发（不推荐在文本框处使用）
        self.line_edit_01.selectionChanged.connect(self.selectionChanged)   # 选择文本变化后触发， 按TAB
        self.line_edit_01.textEdited.connect(self.textEdited)       # 文本内容变动，有一个参数：newVal

        # 使用水平盒子（QHBoxLayout），将 QLabel & QLineEdit 组合到一起
        label_box_01 = QHBoxLayout()
        label_box_01.addWidget(label_01, 1)
        label_box_01.addWidget(self.line_edit_01, 2)  # 要实现两倍的延展，需要同个盒子里面的其他组件，也指定倍率
        

        btn_1 = QPushButton("两倍延展按键")
        btn_2 = QPushButton("一倍延展按键1")
        btn_3 = QPushButton("一倍延展按键2")

        label_box_02 = QHBoxLayout()
        label_box_02.addWidget(btn_1, 2)
        label_box_02.addWidget(btn_2, 1)
        label_box_02.addWidget(btn_3, 1)


        # 设置整体布局为垂直布局
        layout = QVBoxLayout()
        
        layout.addLayout(label_box_01)    # 添加box的时候，需要使用 addLayout() , addItem() 好像也可以
        layout.addLayout(label_box_02)

        self.setLayout(layout)
        
    def textChanged(self):
        self.text_holder_label.setText(f' textChanged: {self.line_edit_01.text()}')

    def cursorPositionChanged(self, old_pos, new_pos):
        print(f'cursorPositionChanged, old_pos: {old_pos}, new_pos: {new_pos}')
    
    def editingFinished(self):
        print('触发 editingFinished 事件')
    
    def returnPressed(self):
        print('触发 returnPressed 事件')
    
    def selectionChanged(self):
        print(f'触发 selectionChanged 事件, 选中文本内容：{self.line_edit_01.selectedText()}')
        print('触发 returnPressed 事件')
    
    def textEdited(self, new_val):
        print(f'触发 textEdited 事件, new_val: {new_val}')


app = QApplication(sys.argv)


window = CustomWidget()
window.show()

app.exec()
